#include "eventloopthread.h"

#include <pthread.h>
#include <functional>

#include "mutex.h"
#include "condition.h"
#include "eventloop.h"

using namespace tiny_muduo;

EventLoopThread::EventLoopThread()
    :loop_(nullptr),
     thread_(std::bind(&EventLoopThread::StartFunc,this)),
     mutex_(),
     cond_(mutex_){
     }

EventLoopThread::~EventLoopThread(){}

EventLoop* EventLoopThread::StartLoop(){
    thread_.StartThread();
    EventLoop* loop=nullptr;
    {
        MutexLockGuard lock(mutex_);
        while(loop_==nullptr){
            cond_.Wait();
        }
        loop=loop_;
    }
    /*
        MutexLockGuard 是一个用于自动管理互斥量的 RAII(资源获取即初始化) 类。当 MutexLockGuard 对象 lock 被创建时，
        会在构造函数中锁定 mutex_（即获取互斥量的所有权），而在其析构函数中释放 mutex_（即释放互斥量的所有权）。在给定
        的代码段中，当程序执行完大括号中的作用域时，MutexLockGuard 对象 lock 的生命周期也就结束了，它会在该作用域结束
        时调用析构函数自动释放锁（即释放互斥量的所有权）。这样就保证了在离开作用域时互斥量会被正确释放，避免了忘记手动释
        放锁而导致的死锁等问题。
    */
    return loop;
}

void EventLoopThread::StartFunc(){
    EventLoop loop;
    {
        MutexLockGuard lock(mutex_);
        loop_=&loop;
        cond_.Signal();
    }

    loop_->Loop();
    {
        MutexLockGuard lock(mutex_);
        loop_=nullptr;
    }
}